OCaml Domains
OCaml - Parallel programming を読む
Domain はマシンスレッドと1対1
Domains are heavy-weight entities. Each domain maps 1:1 to an operating system thread.
なので大量には起動できない
現在の OCaml では128に制限されている
これでもGOMAXPROCS=128に相当するのでかなり多い気がする
Threadripper が 128T なのでそこらへんの数字と考えれば良いのかな
Domainslib を使うべき
Domain を複数起動してタスクをスケジューリングする機能がある
現状はノンプリエンプティブらしい
goroutine のスケジューラは長時間止まっているスレッドを見つけたらそのスレッドごと切り離して寝かせてるがたぶん今のプリミティブでは不可能なんではないか?
Go と同じことをやるには Domain にシグナルハンドラが必要らしい
Domainslib の API は良くできているので,非同期IO プログラミングでも使いたいところだが,この性質で困る
Rust の Futures のようにwakerを登録して一時停止みたいなことができるといいのではないか?
Task.yield pool (fun wake -> register_waker wake)みたいな
こうすればスケジューラが非同期IO の都合を知らずとも非同期に色々を動かせる
select に相当する機能が無いのも困る
Eio が概ね必要な機能を提供していたりする?
Eio.Fiber
Mutex ,Condition,Semaphore や Atomic などのモジュールで同期ができる
いいね
C のコードも並列に動作することを考慮しないといけない
ジャイアントロックはもはや存在しないため